/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mb;

import beans.Mail;
import beans.Usuario;
import beans.UsuarioPermissao;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
import rn.MailRN;
import rn.UsuarioRN;
import rn.UsuarioPermissaoRN;
import util.Utilidades;

/**
 *
 * @author Caio
 */
@ManagedBean(name="controllerUsuario")
@RequestScoped
public class ControllerUsuario implements Serializable {
    
    public ControllerUsuario(){}
    
    @ManagedProperty(value="#{usuario}")
    private Usuario usuario;
    
    @ManagedProperty(value = "#{usuario_permissao}")
    private UsuarioPermissao usuario_permissao;

    private List<Usuario> lista_user;
    private List<UsuarioPermissao> lista_permissao;
    
    private DataModel listaDataModelUser;
    private DataModel listaDataModelPerm;
        
    public void limpar() {
        setUsuario(new Usuario());
        setUsuario_permissao(new UsuarioPermissao());
    }

    ////////////////////////////////////////////////////////////////////////////   
    
    public DataModel getListaDM() {
        UsuarioRN rn = new UsuarioRN();
        this.listaDataModelUser = new ListDataModel(rn.listar());
        return this.listaDataModelUser;
    }
    
    public List<Usuario> getLista() {
        UsuarioRN rn = new UsuarioRN();
        this.lista_user = rn.listar();
        return this.lista_user;
    }    
       
    public void salvar() throws IOException, EmailException{      
        FacesContext context = FacesContext.getCurrentInstance();
        //criando as permissoes do usuario
        UsuarioPermissao perm1 = new UsuarioPermissao();
        perm1.setUsuario(this.usuario);
        perm1.setPermissao("ROLE_USER");
        //criando lista de permissoes
        List<UsuarioPermissao> permissoes =  new ArrayList<UsuarioPermissao>(Arrays.asList(perm1));
        //cadastro de usuario e permissoes
        Boolean ver_cadastro = cadastrar(this.usuario, permissoes);
        Boolean ver_envio = Boolean.FALSE;
        if (ver_cadastro) {
            context.addMessage(null, new FacesMessage("Usuário criado, enviando e-mail..."));
            ver_envio = Utilidades.enviarEmailCadastro(this.usuario.getEmail(),this.usuario.getId());
        } else {
            context.addMessage(null, new FacesMessage("Probema na criação de usuário."));
            rollback(this.usuario, permissoes);
        }
        if (ver_envio) {
            context.addMessage(null, new FacesMessage("E-mail enviado para confirmação"));
        } else {
            context.addMessage(null, new FacesMessage("Falha no envio de e-mail."));
            rollback(this.usuario, permissoes);
        }
        limpar();
    } 

    public void alterar() {
        UsuarioRN rn = new UsuarioRN();
        rn.atualizar(this.usuario);
        limpar();
        FacesContext context = FacesContext.getCurrentInstance();            
        context.addMessage(null, new FacesMessage("Alterado com Sucesso"));
    }

    public void prepararAlterar() {
        this.usuario = (Usuario) this.listaDataModelUser.getRowData();
    }
    
    
    
    public Boolean rollback(Usuario usuario,List<UsuarioPermissao> lista){
        Boolean retorno;
        try {
            UsuarioRN rn_usuario = new UsuarioRN();
            UsuarioPermissaoRN rn_permissao = new UsuarioPermissaoRN();
            rn_usuario.excluir(usuario);
            for(UsuarioPermissao permissao: lista){
                rn_permissao.excluir(permissao);
            }
            retorno = Boolean.TRUE;
        } catch (Exception e) {
            retorno = Boolean.FALSE;
        }
        return retorno;
    }
    
    public Boolean cadastrar(Usuario usuario,List<UsuarioPermissao> lista){
        Boolean retorno;
        try {
            UsuarioRN rn_usuario = new UsuarioRN();
            UsuarioPermissaoRN rn_permissao = new UsuarioPermissaoRN();
            rn_usuario.salvar(usuario);
            for(UsuarioPermissao permissao: lista){
                rn_permissao.salvar(permissao);
            }
            retorno = Boolean.TRUE;
        } catch (Exception e) {
            retorno = Boolean.FALSE;
        }
        return retorno;
    }
    
    public void ativacao() throws IOException{
        try {
            String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
            UsuarioRN rn = new UsuarioRN();
            this.usuario = rn.carregar(Integer.parseInt(id));
            if(this.usuario.getAtivo()!=true){
                this.usuario.setAtivo(Boolean.TRUE);
                rn.atualizar(this.usuario);
                //redirecionando
                FacesContext faces = FacesContext.getCurrentInstance();
                ExternalContext exContext = faces.getExternalContext();
                exContext.redirect("index.jsf");
            } else {
                FacesContext context = FacesContext.getCurrentInstance();            
                context.addMessage(null, new FacesMessage("Usuário já ativado!"));
            }
        } catch (NumberFormatException e) {
            FacesContext context = FacesContext.getCurrentInstance();            
            context.addMessage(null, new FacesMessage("Erro ao ativar usuário"));
        }
    }
    
    ////////////////////////////////////////////////////////////////////////////
    
    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public UsuarioPermissao getUsuario_permissao() {
        return usuario_permissao;
    }

    public void setUsuario_permissao(UsuarioPermissao usuario_permissao) {
        this.usuario_permissao = usuario_permissao;
    }

    public List<Usuario> getLista_user() {
        return lista_user;
    }

    public void setLista_user(List<Usuario> lista_user) {
        this.lista_user = lista_user;
    }

    public List<UsuarioPermissao> getLista_permissao() {
        return lista_permissao;
    }

    public void setLista_permissao(List<UsuarioPermissao> lista_permissao) {
        this.lista_permissao = lista_permissao;
    }

    public DataModel getListaDataModelUser() {
        return listaDataModelUser;
    }

    public void setListaDataModelUser(DataModel listaDataModelUser) {
        this.listaDataModelUser = listaDataModelUser;
    }

    public DataModel getListaDataModelPerm() {
        return listaDataModelPerm;
    }

    public void setListaDataModelPerm(DataModel listaDataModelPerm) {
        this.listaDataModelPerm = listaDataModelPerm;
    }    
    
}
